package com.ss.plugins.ws.collect.api;

import com.alibaba.fastjson.JSONObject;
import com.ss.plugins.ws.collect.model.SessionBean;


import javax.websocket.Session;
import java.io.IOException;
import java.util.List;
import java.util.Optional;


/**
 * 存储Session的接口
 * @author xia17
 * @description: TODO
 * @date 2019/5/11 14:33
 */

public interface WsSessionList<T extends SessionBean> {


    /**
     * 查看是否包含这个
     * @param t 查询类
     * @return 包含则返回这个 否则返回null
     */
    boolean contain(T t);


    /**
     * 添加一个
     * @param t 添加的对象
     * @return 添加是否成功
     */
    boolean add(T t);

    /**
     * 移除一个Session
     * @param t 移除的对象的唯一标识
     * @return 返回是否成功
     */
    boolean remove(T t);

    /**
     * 移除一个Session
     * @param session 通过session移除
     * @return 返回是否成功
     */
    boolean remove(Session session);

    /**
     * 获取客户端数量
     * @return int
     */
    int clientSize();

    /**
     * 获取Session数量
     * @return int
     */
    int sessionSize();

    /**
     * 获取所有Session
     * @return list
     */
    List<Session> getAllSession();

    /**
     * 获取一个客户端的Session
     * @param t 唯一标识相同的对象
     * @return 如果不存在返回的
     */
    List<Session> getSession(T t);


    /**
     * 根据Ws 的 session 获取一个包装session的Bean（带有自己数据的）
     * @param session session
     * @return 不存在返回null
     */
    Optional<T> getSessionBean(Session session);

    /**
     * 根据SessionBean 获取SessionBean数据
     * @param sessionBean 唯一标识相同的
     * @return 返回一个Object ,单页面是个对象，
     */
    Optional<T> getSessionBean(T sessionBean);

    /**
     * 根据SessionBean 获取SessionBean数据
     * @param sessionBean 唯一标识相同的
     * @return 返回一个Object 多页面是个集合
     */
    List<T> getSessionBeanList(T sessionBean);



    /**
     * 发送消息给一个客户端，可能有多个连接
     * @param t 唯一标识
     * @param msg 消息
     */
    default void sendToOneClient(T t, String msg){
        List<Session> list = this.getSession(t);
        for (Session session : list) {
            try {
                session.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                System.err.println("发送一个消息失败。SessionId是"+session.getId());
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送消息给一个客户端，可能有多个连接
     * @param t 唯一表示
     * @param object 消息
     */
    default void sendToOneClient(T t, Object object){
        if (object==null){
            object = "";
        }
        this.sendToOneClient(t,JSONObject.toJSONString(object));
    }




    /**
     * 发送消息给所有客户端的所有连接
     * @param msg 消息
     */
    default void sendToAll(String msg){
        List<Session> allSession = this.getAllSession();
        for (Session session : allSession) {
            try {
                session.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                System.err.println("发送一个消息失败。SessionId是"+session.getId());
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送消息给所有客户端的所有连接
     * @param object 对象
     */
    default void sendToAll(Object object){
        if (object==null){
            object = "";
        }
        this.sendToAll(JSONObject.toJSONString(object));
    }
}
